home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / dsort / dstqsrt.pre < prev   
Text File  |  1993-07-08  |  6KB  |  187 lines

  1.     page    96,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§              ディレクトリエントリ  ソート  ユーティリティ                §
  5. ;§                                                                          §
  6. ;§                                     DSORT.EXE  Ver1.30    §
  7. ;§                                                                          §
  8. ;§              Copyright (C) by 福地 邦雄 1991-1992. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     .MODEL  SMALL,C
  11. ;
  12. REVERSE     equ 1
  13. FALSE       equ 0
  14. direntrysize    equ 20h
  15. direntryseg     equ 2
  16. ;
  17.     public  dirqsort,dirswap,sortfuncall
  18. ;
  19.     .code
  20. ;
  21. ;------------------------------------------------------------------------------
  22. ;
  23. ;   dirqsort
  24. ;       ディレクトリエントリのクイックソート
  25. ;
  26. ;   TYPE    near call
  27. ;   IN      [SP+2] = ソートバッファセグメント
  28. ;           [SP+4] = 要素数
  29. ;           ES:[SP+6] = 比較関数リストアドレス
  30. ;   OUT     なし
  31. ;   保存レジスタ    bp,ds
  32. ;
  33. ;------------------------------------------------------------------------------
  34. ;
  35. dirqsort    proc    sortobj,elmcount,funclist
  36.     local cmpobj,chgedobj,cmpcount,chgcount,funcseg
  37. ;
  38.     mov     funcseg,es
  39. qsorthead:
  40.     cmp     elmcount,1
  41.     @if (zf,off),and,(cf,off),L     ; 要素数2以上ならソート実行
  42.         mov     dx,sortobj
  43.         add     dx,direntryseg
  44.         cmp     elmcount,02
  45.         mov     cmpobj,dx
  46.         @if (zf,on)                 ; 要素数2なら直接比較
  47.             mov     bx,funclist
  48.             mov     es,funcseg
  49.             mov     ds,sortobj
  50.             call    sortfuncall
  51.             test    ax,ax
  52.             @if (zf,off),and,(sf,off)   ; エントリ1が大きい時は入れ換え
  53.                 mov     es,cmpobj
  54.                 mov     ds,sortobj
  55.                 call    dirswap
  56.             @ifend
  57.         @else                       ; 要素数3以上
  58.             mov     ax,elmcount     ; 比較の基準を配列の真ん中から取り出す
  59.             and     ax,0fffeh
  60.             add     ax,sortobj
  61.             mov     es,ax
  62.             mov     ds,sortobj
  63.             call    dirswap
  64.             mov     ax,sortobj      ; 準備
  65.             mov     chgcount,0
  66.             mov     cmpcount,1
  67.             mov     chgedobj,ax
  68.             @do repeat
  69.                 mov     ax,cmpcount ; 比較終了か?
  70.                 @if (ax,>=,elmcount)
  71.                     @doexit
  72.                 @ifend
  73.                 mov     dx,sortobj  ; 比較関数呼び出し
  74.                 mov     ds,cmpobj
  75.                 mov     bx,funclist
  76.                 mov     es,funcseg
  77.                 call    sortfuncall
  78.                 test    ax,ax
  79.                 @if (sf,on)         ; 比較対象エントリが小さい時
  80.                     inc     chgcount
  81.                     add     chgedobj,direntryseg
  82.                     mov     si,cmpobj
  83.                     mov     es,si
  84.                     mov     di,chgedobj
  85.                     mov     ds,di
  86.                     @if (si,/=,di)
  87.                         call      dirswap
  88.                     @ifend
  89.                 @ifend
  90.                 add     cmpobj,direntryseg  ; 次の比較対象へ
  91.                 inc     cmpcount
  92.             @doend
  93.             mov     di,sortobj      ;
  94.             mov     ds,di
  95.             mov     si,chgedobj
  96.             mov     es,si
  97.             @if (si,/=,di)
  98.                 call      dirswap
  99.             @ifend
  100.             mov     bx,chgedobj     ; 再帰呼び出し準備
  101.             add     bx,direntryseg
  102.             mov     cx,elmcount
  103.             mov     ax,chgcount
  104.             sub     cx,ax
  105.             dec     cx
  106.             @if (cx,>,ax),S         ; エントリ数の少ない方によって環境を整える
  107.                 mov     elmcount,cx ; 入れ換え済の方が少ない
  108.                 mov     cx,ax
  109.                 xchg    bx,sortobj
  110.             @else
  111.                 mov     elmcount,ax ; 入れ換え無しの方が少ない
  112.             @ifend
  113.             @if (cx,>,1)            ; 要素数2以上なら
  114.                 mov     es,funcseg  ;
  115.                 push    funclist    ; 再帰呼び出し(エントリの少ない方)
  116.                 push    cx
  117.                 push    bx
  118.                 call    dirqsort
  119.             @ifend
  120.             jmp     qsorthead       ; 末尾再帰呼び出し(ループ)
  121.         @ifend
  122.     @ifend
  123.     ret     6
  124. ;
  125. dirqsort    endp
  126. ;
  127. ;------------------------------------------------------------------------------
  128. ;
  129. ;   dirswap
  130. ;       ディレクトリエントリの交換
  131. ;
  132. ;   TYPE    near call
  133. ;   IN      DS:0  = エントリ1アドレス
  134. ;           ES:0  = エントリ2アドレス
  135. ;   OUT     なし
  136. ;   保存レジスタ    bx,dx,di,bp,ds,es
  137. ;
  138. ;------------------------------------------------------------------------------
  139. ;
  140. dirswap proc
  141. ;
  142.     mov     cx,direntrysize/2
  143.     xor     si,si
  144. swaploop:
  145.     mov     ax,[si]
  146.     xchg    es:[si],ax
  147.     mov     [si],ax
  148.     lea     si,[si+2]
  149.     loop    swaploop
  150. ;
  151.     ret
  152. ;
  153. dirswap endp
  154. ;
  155. ;------------------------------------------------------------------------------
  156. ;
  157. ;   sortfuncall
  158. ;       ソート用比較関数列の呼び出し
  159. ;
  160. ;   TYPE    near call
  161. ;   IN      ES:BX = 比較関数列のアドレス
  162. ;           DS:0  = エントリ1アドレス
  163. ;           DX:0  = エントリ2アドレス
  164. ;   OUT     AX = 比較結果
  165. ;   保存レジスタ    si,di,bp,ds,es
  166. ;
  167. ;------------------------------------------------------------------------------
  168. ;
  169. sortfuncall proc
  170. ;
  171.     @do until
  172.         call    word ptr es:[bx]    ; 比較関数呼び出し
  173.         @if (word ptr es:[bx+2],=,REVERSE)  ; 逆順指定の時は結果を反転
  174.             neg     ax
  175.         @ifend
  176.         @if (ax,/=,0)               ; 比較して違いがあれば終了
  177.             jmp     compareend
  178.         @ifend
  179.         lea     bx,[bx+4]           ; 次の比較関数へ
  180.     @doend (word ptr es:[bx],=,0)   ; 関数列の終了まで
  181. compareend:
  182.     ret
  183. ;
  184. sortfuncall endp
  185. ;
  186.     end
  187.